Linux Shell 监控网络延迟

1 脚本说明

  1. 使用 mtr 获取 目标的平均延迟(Avg)
  2. 记录日志到文件
  3. 在延迟超过阈值时报警

2 ✅ 使用 mtr 的网络延迟监控脚本(net_latency_check.sh

#!/bin/bash

# ============================
# 基于 mtr 的网络延迟监控脚本
# ============================

TARGET_IP="192.168.1.100"      # 修改为你的目标 IP
THRESHOLD_MS=100               # 延迟报警阈值(单位:ms)
LOG_FILE="/var/log/net_latency.log"
SLEEP_INTERVAL=5               # 检测间隔(秒)
MTR_PATH=$(which mtr)          # 自动寻找 mtr 路径

# 报警函数(可扩展邮件、钉钉等)
alert() {
  local message=$1
  local timestamp=$(date '+%F %T')
  echo "$timestamp [ALERT] $message"
  echo "$timestamp [ALERT] $message" >> "$LOG_FILE"
}

# 检测函数
check_latency() {
  if ! $MTR_PATH -rwzc 1 "$TARGET_IP" > /tmp/mtr_out 2>/dev/null; then
    alert "目标 $TARGET_IP 无法到达!"
    echo "$(date '+%F %T') [ERROR] MTR failed for $TARGET_IP" >> "$LOG_FILE"
    return
  fi

  # 提取最后一跳的 Avg 延迟
  RTT=$(tail -n 1 /tmp/mtr_out | awk '{print $(NF-1)}')

  # 判断是否数字
  if [[ ! $RTT =~ ^[0-9]+(\.[0-9]+)?$ ]]; then
    alert "无法解析延迟信息:$RTT"
    return
  fi

  # 写入日志
  echo "$(date '+%F %T') [INFO] MTR to $TARGET_IP: ${RTT} ms" >> "$LOG_FILE"

  # 判断是否超阈值
  RTT_INT=${RTT%.*}
  if (( RTT_INT > THRESHOLD_MS )); then
    alert "延迟过高:${RTT} ms,阈值为 ${THRESHOLD_MS} ms"
  fi
}

# 主循环
while true; do
  check_latency
  sleep $SLEEP_INTERVAL
done

3 📌 脚本说明


4 ✅ 使用步骤

# 安装 mtr(如未安装)
sudo apt install mtr  # Ubuntu/Debian
sudo yum install mtr  # CentOS/RHEL

# 保存脚本
nano mtr_latency_check.sh

# 复制粘贴内容,保存退出
chmod +x mtr_latency_check.sh

# 后台运行
nohup ./mtr_latency_check.sh &

5 🧩 示例输出日志(/var/log/net_latency.log)

2025-04-03 20:30:01 [INFO] MTR to 192.168.1.100: 27.4 ms
2025-04-03 20:30:06 [INFO] MTR to 192.168.1.100: 35.7 ms
2025-04-03 20:30:11 [ALERT] 延迟过高:135.4 ms,阈值为 100 ms